package dominioDAO;

import hbt.HibernateDAO;
import hbt.HibernateUtil;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import dominioEntity.Cliente;
import dominioEntity.ItemSolicitud;
import dominioEntity.Proveedor;
import dominioEntity.SolicitudRodamientos;
import dominioTO.ItemSolicitudTO;
import dominioTO.ProveedorTO;
import dominioTO.SolicitudRodamientosTO;

public class SolicitudRodamientoDAO {
	private static SolicitudRodamientoDAO instancia ;
	private static SessionFactory sf;
	private static Session session;
	
	public static SolicitudRodamientoDAO getInstancia() {
		if(instancia == null){
			instancia = new SolicitudRodamientoDAO();
		} 
		return instancia;
	}
	public SolicitudRodamientoDAO()
	{
		sf = HibernateUtil.getSessionFactory();
	}
	
	protected Session getSession(){
		if(session == null || !session.isOpen()){
			session = sf.openSession();
		}
		return session;
	}
	protected void closeSession()
	{
		if(session.isOpen())
		{
			session.close();
		}
	}
	
	public void persistirSolicitudCliente(List<SolicitudRodamientosTO> list) throws RemoteException
	{		
			
		for(SolicitudRodamientosTO dto : list)
		{
			SolicitudRodamientos solicitudRodamiento = new SolicitudRodamientos();
			Cliente c = ClienteDao.getInstancia().buscarCliente(dto.getCliente().getCuit());
			
			if(c!=null)
			{
				solicitudRodamiento.setCliente(c);
	
				solicitudRodamiento.setFechaSolicitud(dto.getFechaSolicitud());
				solicitudRodamiento.setOrdenCompraCliente(dto.getOrdenCompraCliente());
				
				if(dto.getItemSolicitudes()!=null)
				{
					List <ItemSolicitudTO> itemsTO =dto.getItemSolicitudes();
					List<ItemSolicitud> itemsSoli = new ArrayList<ItemSolicitud>();
					for (ItemSolicitudTO itemTO : itemsTO)
					{
						ItemSolicitud item = new ItemSolicitud();
						item.setCantidad(itemTO.getCantidad());
						item.setMarca(itemTO.getMarca());
						item.setnSerie(itemTO.getnSerie());
						item.setOrigen(itemTO.getOrigen());
						item.setSufijo(itemTO.getSufijo());
						
						itemsSoli.add(item);
					}
					solicitudRodamiento.setItemSolicitud(itemsSoli);
				}

				this.grabarSolicitud(solicitudRodamiento);
			}
			
			
		}
	}
	
	public void grabarSolicitud(SolicitudRodamientos sr) {
		
		Session s = this.getSession();
		s.beginTransaction();
		s.saveOrUpdate(sr);
		s.flush();
		session.getTransaction().commit();
		this.closeSession();

	}
		
	public SolicitudRodamientos buscarSolicitudRodamiento(String cuit, String OrdenCliente)
	{
		
		Session session = sf.openSession();
		String sentencia = "from SolicitudRodamientos sr where sr.cliente.cuit=:cuit and OrdenCompraCliente=:oc";		
		SolicitudRodamientos sr = (SolicitudRodamientos) session.createQuery(sentencia).setParameter("cuit", cuit).setParameter("oc", OrdenCliente).uniqueResult();
		session.close();
		if(sr==null)
		{
			return null;	
		}
		return sr;
	}
	
	@SuppressWarnings("unchecked")
	public ProveedorTO buscarProveedor(String cuit)
	{
		Session session = sf.openSession();
		String sentencia = "from Proveedor p where p.cuit=?";
		
		List<Proveedor> prov = (List<Proveedor>) session.createQuery(sentencia).setString(0, cuit).list();
		this.closeSession();
		if(prov.isEmpty())
		{
			return null;	
		}
		return prov.get(0).getDTO();
	}
	
}
